package es.tikitaka.actions.usuarios;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.impl.UsuarioServiceImpl;
import es.tikitaka.domain.usuarios.Usuario;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("recordarMail")
@Scope(ScopeType.CONVERSATION)
public class RecordarMailAction {

	private String correo;
	private Usuario user;

	@In(create = true)
	private UsuarioServiceImpl usuarioService;

	public RecordarMailAction() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Funcion que crea el email que se enviará al usuario con su clave de
	 * acceso a la aplicación.
	 */
	public void recordarPassword() {

		if (correo != null && correo.length() > 0) {

			Usuario user = usuarioService.getUsuario(correo);
			if (user != null) {
				String texto;
				String subject;
				SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
				Date date = new Date();

				try {
					String fecha = formato.format(date);

					texto = "<h1>"
							+ "<span style='font-family: arial,helvetica,sans-serif;'>"
							+ "Tikitaka"
							+ "</span>"
							+ "</h1>"
							+ "<h4>"
							+ "Recordatorio de clave de acceso.<"
							+ "/h4>"
							+ "<p>"
							+ "La clave de acceso vinculada a su cuenta de correo "
							+ "<span style='color: rgb(0, 0, 255);'>"
							+ user.getEmail()
							+ "</span>"
							+ " es:"
							+ "</p>"
							+ "<p>"
							+ "clave: "
							+ user.getPassword()
							+ "</p>"
							+ "<p>"
							+ "------------"
							+ "</p>"
							+ "<img alt='' src='temas/tiki/imagenes/otros/firma.jpg"
							+ " style='margin-left: 10px; margin-right: 10px; float: left; width: 158px; height: 167px;'/>"
							+ "<p>"
							+ "<span style='font-size: 10px;'>"
							+ fecha
							+ "Este es un mensaje autogenerado por tikitaka | 2010."
							+ "</span>" + "</p>";

					subject = "Recordatorio password Tikitaka";

					EnviarMail(subject, texto);
				} catch (Exception e) {
					FacesMessages.instance().add(
							"No se pudo enviar el mail de aviso");
				}
			} else {
				FacesMessages.instance().add(
						"No se encuentra ningún usuario con ese correo");
			}
		}
	}

	/**
	 * 
	 * Funcion para enviar el email al usuario de la aplicación
	 * 
	 * @param correo
	 *            Email del usuario y destino del correo
	 * @param texto
	 *            Texto que se incluirá en el email
	 */
	private void EnviarMail(String subject, String texto) {

		Properties props = new Properties();

		String servidorSmtp = ResourceBundle.getBundle("mail").getString(
				"mail.smtp.host");
		String tls = ResourceBundle.getBundle("mail").getString(
				"mail.smtp.starttls.enable");
		String puerto = ResourceBundle.getBundle("mail").getString(
				"mail.smtp.port");
		String usuarioSMTP = ResourceBundle.getBundle("mail").getString(
				"mail.smtp.user");
		String aunteticacion = ResourceBundle.getBundle("mail").getString(
				"mail.smtp.auth");
		String pass = ResourceBundle.getBundle("mail").getString("mail.pass");
		String from = ResourceBundle.getBundle("mail").getString("mail.from");

		// Nombre del host de correo, es smtp.gmail.com
		props.setProperty("mail.smtp.host", servidorSmtp);

		// TLS si está disponible
		props.setProperty("mail.smtp.starttls.enable", tls);

		// Puerto de gmail para envio de correos
		props.setProperty("mail.smtp.port", puerto);

		// Nombre del usuario
		props.setProperty("mail.smtp.user", usuarioSMTP);

		// Si requiere o no usuario y password para conectarse.
		props.setProperty("mail.smtp.auth", aunteticacion);

		Session session = Session.getDefaultInstance(props);
		session.setDebug(true);

		MimeMessage message = new MimeMessage(session);

		try {

			// Quien envia el correo
			message.setFrom(new InternetAddress(from));

			// A quien va dirigido
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(
					correo));

			// Establecemos el asunto
			message.setSubject(subject);
			// añadimos el texto en formato web
			message.setText(texto, "ISO-8859-1", "html");

			Transport t = session.getTransport("smtp");

			t.connect(usuarioSMTP, pass);
			t.sendMessage(message, message.getAllRecipients());
			t.close();

		} catch (AddressException e) {
			FacesMessages
					.instance()
					.add(
							"No se pudo enviar email de notificación (dirección incorrecta)");
			e.printStackTrace();
		} catch (MessagingException e) {
			FacesMessages.instance().add(
					"No se pudo enviar email de notificación");
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/*
	 * getters and setters
	 */
	public String getCorreo() {
		return correo;
	}

	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public Usuario getUser() {
		return user;
	}

	public void setUser(Usuario user) {
		this.user = user;
	}

}
